////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVERENGINE_H_
#define _SERVERENGINE_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVERBATTLEFIELD_H_
#include "serverbattlefield.h"
#endif

#ifndef _MUTEX_H_
#include "mutex.h"
#endif

#ifndef _CLIENTSTATISTICS_H_
#include "clientstatistics.h"
#endif

////////////////////////////////////////////////////////////////////////////////

class Server;
class ClientInfoPacket;
class ClientInputPacket;

////////////////////////////////////////////////////////////////////////////////


/** Game server engine
*
*  @author   Roman Pasechnik
*  @author   Anastasia Karpinska
*  @since    Jun 04th, 2009
*  @updated  May 21st, 2010
*/
class ServerEngine
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerEngine ();


    /** Update engine state */
    void UpdateState();


////////////////////////////////////////////////////////////////////////////////


    /** Update information about a client input */
    void UpdateClientInput( int _clientID, const ClientInputPacket& _clientInputPacket );


    /** Update information about a client info */
    void UpdateClientInfo( int _clientID, const ClientInfoPacket& _clientInfoPacket );


////////////////////////////////////////////////////////////////////////////////


    /** Remove player from engine */
    void RemoveClient( int _clientID );


////////////////////////////////////////////////////////////////////////////////


    /** Get game state */
    ServerState GetState() const;


    /** Gets battlefield */
    ServerBattlefield& Battlefield();


    /** Get all clients IDs */
    const IntSet& GetClientsIDs() const;


////////////////////////////////////////////////////////////////////////////////


    /** Load game map from file*/
    void LoadMap();


////////////////////////////////////////////////////////////////////////////////


    /** Handle killing event */
    void HandleKilling( int _playerID, int _killerID );


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Get delta time from prev update */
    size_t GetTimeDiffFromPrevUpdate() const;


////////////////////////////////////////////////////////////////////////////////


    /** Battle arena */
    struct SyncServerBattlefield : public ServerBattlefield, public Mutex
    {
        SyncServerBattlefield( ServerEngine* _engine ) : ServerBattlefield(_engine) {}
    };

    mutable SyncServerBattlefield m_Battlefield;


    /** ID of all clients */
    IntSet m_ClientsID;


    /** Nicknames of all clients */
    std::map<int, ClientStatistics> m_ClientsStat;


    /** Game map name */
    std::string m_MapName;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////
